헬름 차트
1. 개요
1. 개요
헬름 차트는 쿠버네티스 애플리케이션을 정의, 설치, 업그레이드하는 데 사용되는 패키지 관리 도구이다. 애플리케이션의 모든 리소스 정의와 구성 값을 하나의 패키지로 묶어 관리함으로써, 복잡한 컨테이너 오케스트레이션 환경에서의 배포를 단순화하고 자동화하는 데 주로 사용된다.
이 도구는 2015년에 최초 등장했으며, 초기에는 Deis[6]에 의해 개발되었다. 헬름의 핵심 목적은 쿠버네티스 애플리케이션의 패키징, 버전 관리, 배포 자동화를 지원하는 것이다. 이를 통해 DevOps와 CI/CD 파이프라인에서 애플리케이션을 일관되고 재현 가능한 방식으로 반복적으로 배포할 수 있다.
헬름 차트는 미리 정의된 구조와 파일들로 구성된다. 주요 구성 요소로는 애플리케이션 메타데이터를 담은 Chart.yaml, 쿠버네티스 매니페스트 템플릿이 위치하는 templates 디렉터리, 그리고 배포 시 사용자 정의 값을 제공하는 values.yaml 파일 등이 있다. 이 구조는 애플리케이션을 하나의 버전 관리 가능한 단위로 만들어 준다.
사용자는 헬름 CLI를 통해 차트를 생성, 검사, 패키징할 수 있으며, 로컬 또는 원격 리포지토리에서 차트를 찾아 설치하거나 업그레이드, 삭제할 수 있다. 이는 시스템 관리자와 개발자에게 애플리케이션 라이프사이클을 효과적으로 관리할 수 있는 강력한 프레임워크를 제공한다.
2. 구성 요소
2. 구성 요소
2.1. Chart.yaml
2.1. Chart.yaml
Chart.yaml 파일은 헬름 차트의 메타데이터를 정의하는 필수 구성 파일이다. 이 파일은 차트의 이름, 버전, 설명, 유지 관리자 정보, 의존성 등 차트 자체에 대한 정보를 담고 있다. 쿠버네티스 클러스터에 애플리케이션을 배포하기 위한 실제 리소스 템플릿이나 설정값과는 구분되며, 차트를 식별하고 관리하는 데 필요한 기본 정보를 제공한다.
파일은 YAML 형식으로 작성되며, apiVersion, name, version 필드는 반드시 정의되어야 하는 필수 필드에 해당한다. apiVersion은 차트 API 버전을 나타내며, 헬름 3는 주로 v2를 사용한다. name은 차트의 이름으로, 리포지토리 내에서 고유해야 한다. version은 시맨틱 버전 관리 규칙을 따라야 하며, 차트의 업그레이드와 의존성 해결에 중요한 역할을 한다.
선택적 필드로는 애플리케이션에 대한 간략한 description, 상세한 home 페이지 URL, 키워드 목록인 keywords, 소스 코드 위치를 나타내는 sources 등이 있다. 또한 차트의 유지 관리자 정보를 maintainers 필드에 나열할 수 있으며, 이는 사용자에게 연락처를 제공하는 데 도움이 된다. 가장 중요한 선택적 필드 중 하나는 dependencies로, 이 차트가 동작하기 위해 필요한 다른 헬름 차트들의 목록을 정의한다.
Chart.yaml 파일은 헬름 명령어를 실행할 때 차트를 식별하는 기준이 된다. 예를 들어 helm install이나 helm upgrade 명령 시 이 파일의 메타데이터를 참조하며, Artifact Hub 같은 차트 리포지토리에서는 이 정보를 기반으로 차트를 검색하고 표시한다. 따라서 정확하고 완전한 메타데이터 작성을 통해 차트의 재사용성과 유지 보수성을 높일 수 있다.
2.2. 템플릿 (Templates)
2.2. 템플릿 (Templates)
헬름 차트의 템플릿은 쿠버네티스 매니페스트 파일을 동적으로 생성하는 핵심 구성 요소이다. 템플릿 파일은 templates/ 디렉토리 내에 위치하며, Go 템플릿 문법을 기반으로 작성된다. 이 파일들은 values.yaml에 정의된 값이나 명령줄에서 전달된 값을 참조하여, 최종적인 쿠버네티스 리소스 정의 파일(YAML 또는 JSON 형식)을 렌더링한다. 이를 통해 단일 차트로 다양한 환경(예: 개발, 스테이징, 프로덕션)에 맞는 서로 다른 설정을 가진 매니페스트를 생성할 수 있다.
템플릿은 디플로이먼트, 서비스, 컨피그맵, 시크릿 등 모든 종류의 쿠버네티스 리소스를 정의할 수 있다. 템플릿 내에서는 조건문(if/else), 반복문(range), 변수, 함수와 같은 프로그래밍적 요소를 사용하여 복잡한 로직을 구현할 수 있다. 또한 헬름이 제공하는 내장 객체(예: .Release, .Values, .Chart)와 수백 가지의 스프리그 함수를 활용하여 날짜 형식 지정, 문자열 조작, 암호 생성 등의 작업을 수행할 수 있다.
템플릿을 작성할 때는 가독성과 유지보수성을 고려해야 한다. 지나치게 복잡한 템플릿 로직은 차트의 이해와 디버깅을 어렵게 만든다. 공통적으로 사용되는 설정이나 라벨은 _helpers.tpl 파일에 네임드 템플릿으로 정의하여 여러 리소스에서 재사용하는 것이 좋다. 또한, helm template 명령어를 사용하면 실제로 클러스터에 설치하지 않고도 렌더링된 매니페스트를 미리 검토할 수 있어 개발 과정에서 유용하다.
템플릿 엔진의 강력함은 헬름 차트가 단순한 정적 파일 묶음이 아닌, 진정한 패키지 관리 도구로서 역할을 할 수 있게 하는 기반이다. 이를 통해 애플리케이션 구성의 표준화와 자동화를 달성하며, DevOps 및 CI/CD 파이프라인에 효과적으로 통합될 수 있다.
2.3. values.yaml
2.3. values.yaml
values.yaml 파일은 헬름 차트의 구성 가능성을 담당하는 핵심 파일이다. 이 파일은 차트 사용자가 템플릿 내에서 참조할 수 있는 기본 설정값들을 정의한다. 즉, 동일한 차트를 다양한 환경(예: 개발, 스테이징, 프로덕션)이나 서로 다른 요구사항에 맞게 재사용할 수 있도록 파라미터화하는 역할을 한다. values.yaml에 정의된 값들은 Go 템플릿 문법을 사용하는 템플릿 파일들에서 .Values 객체를 통해 접근하여 동적인 쿠버네티스 매니페스트를 생성하는 데 사용된다.
파일 구조는 일반적으로 YAML 형식을 따르며, 사용자 정의가 필요한 모든 설정을 키-값 쌍으로 나열한다. 예를 들어, 애플리케이션의 복제본 수, 컨테이너 이미지의 태그, 서비스 타입, 리소스 요청량과 한계, 환경 변수 등을 설정할 수 있다. 이 파일은 차트 개발자가 제공하는 기본값을 포함하며, 사용자는 이 값을 덮어쓰거나 확장하여 자신의 구성을 적용한다.
사용자는 helm install 또는 helm upgrade 명령어를 실행할 때 --values 또는 -f 플래그를 사용해 별도의 YAML 파일을 지정하거나, --set 플래그를 사용해 커맨드라인에서 직접 값을 덮어쓸 수 있다. 이때 적용 우선순위는 커맨드라인 --set 값이 가장 높고, 그다음으로 -f로 지정한 파일, 마지막으로 차트 내부의 기본 values.yaml 파일 순이다. 이러한 유연한 구성 방식을 통해 DevOps 및 CI/CD 파이프라인에서 환경별 차이를 효율적으로 관리할 수 있다.
효율적인 values.yaml 설계는 차트의 유용성을 크게 좌우한다. 관련된 설정들은 논리적으로 그룹화하고, 각 키에는 설명이 포함된 주석을 달아 가독성을 높이는 것이 좋다. 또한, 민감한 정보(예: 비밀번호)는 values.yaml에 직접 작성하기보다는 쿠버네티스 시크릿을 참조하도록 구성하는 것이 보안 모범 사례에 부합한다.
2.4. 의존성 (Dependencies)
2.4. 의존성 (Dependencies)
헬름 차트는 다른 헬름 차트에 대한 의존성을 정의하고 관리할 수 있다. 이는 복잡한 애플리케이션을 구성하는 여러 구성 요소를 모듈화하고 재사용하는 데 유용하다. 의존성은 차트의 Chart.yaml 파일 내 dependencies 필드에 명시된다. 여기에는 필요한 하위 차트의 이름, 버전, 리포지토리 위치가 포함된다.
의존성 관리를 위해 helm dependency 명령어 세트를 사용한다. helm dependency update 명령을 실행하면 Chart.yaml에 정의된 의존성 정보를 바탕으로 charts/ 디렉토리에 필요한 하위 차트의 압축 파일(.tgz)을 다운로드한다. 이때 의존성 차트의 특정 버전을 고정하는 Chart.lock 파일이 생성된다. 이를 통해 재현 가능한 빌드 환경을 보장한다.
의존성 차트의 값을 상위 차트에서 제어할 수 있다. 상위 차트의 values.yaml 파일에 하위 차트의 이름을 키로 하는 섹션을 만들고, 그 안에 하위 차트의 values.yaml에 정의된 변수들을 재정의할 수 있다. 이를 통해 중앙에서 일관된 설정을 관리하면서도 각 구성 요소의 세부 구성을 유연하게 조정할 수 있다.
의존성은 애플리케이션 스택을 구성하는 데이터베이스, 캐시, 메시지 큐와 같은 공통 컴포넌트를 별도의 차트로 분리하여 관리할 때 특히 효과적이다. 예를 들어, 웹 애플리케이션 차트가 PostgreSQL 차트와 Redis 차트에 의존하도록 정의하면, 애플리케이션 배포 시 필요한 모든 인프라 구성 요소가 함께 설치된다. 이는 마이크로서비스 아키텍처나 복합 애플리케이션의 배포를 단순화한다.
2.5. README 및 NOTES.txt
2.5. README 및 NOTES.txt
헬름 차트 내에는 사용자와 개발자를 위한 중요한 문서 파일들이 포함된다. 주로 README.md 파일과 templates/NOTES.txt 파일이 이에 해당하며, 각각 차트의 사용법과 설치 후 확인 사항을 안내하는 역할을 한다.
README.md 파일은 차트의 기본 사용 설명서이다. 이 파일은 일반적으로 차트의 루트 디렉터리에 위치하며, 마크다운 문법으로 작성된다. 여기에는 차트의 목적, 필수 의존성, values.yaml을 통해 설정 가능한 주요 구성 옵션, 그리고 차트를 설치하고 사용하는 방법에 대한 상세한 지침이 담긴다. 아티팩트 허브와 같은 공개 리포지토리에서는 이 README.md의 내용이 차트의 메인 문서로 표시되어 사용자가 차트의 기능과 설정 방법을 쉽게 이해할 수 있도록 돕는다.
반면, templates/NOTES.txt 파일은 템플릿 디렉터리 내에 위치하는 특수한 지침 파일이다. 이 파일은 고 템플릿 엔진에 의해 처리되며, 사용자가 helm install 명령을 실행한 직후 터미널에 출력되는 메시지를 정의한다. 이 메시지는 설치된 애플리케이션에 접근하는 방법(예: 서비스의 외부 IP 주소나 URL), 필요한 시크릿 확인 방법, 또는 다음 단계로 수행할 작업 등을 안내하는 데 유용하게 사용된다. 이를 통해 사용자는 설치 완료 후 즉시 애플리케이션을 확인하고 사용할 수 있다.
효과적인 README.md와 NOTES.txt 파일을 작성하는 것은 차트의 유용성을 크게 높인다. README.md는 포괄적이고 정확한 정보를 제공해야 하며, NOTES.txt는 설치 직후의 상황에 맞는 실용적이고 실행 가능한 지침을 간결하게 제시해야 한다. 이 두 문서는 쿠버네티스 애플리케이션의 배포 및 운영 경험을 개선하는 데 중요한 역할을 한다.
3. 작동 방식
3. 작동 방식
헬름 차트는 쿠버네티스 애플리케이션을 패키징하고 배포하기 위한 표준 형식이다. 이 차트는 애플리케이션을 구성하는 모든 쿠버네티스 리소스 정의 파일과 설정값, 의존성 정보를 포함하는 하나의 패키지로, 복잡한 애플리케이션 스택을 단일 명령어로 관리할 수 있게 해준다.
헬름의 핵심 구성 요소는 헬름 클라이언트와 틸러 서버였으나, 헬름 3 버전부터는 아키텍처가 단순화되어 틸러가 제거되었다. 현재는 헬름 클라이언트가 직접 쿠버네티스 API와 상호작용하여 차트를 설치하고 관리한다. 사용자는 helm install과 같은 명령어를 통해 차트를 지정하면, 헬름은 차트 내의 템플릿 파일과 사용자가 제공한 values.yaml 설정값을 결합하여 최종 쿠버네티스 매니페스트를 생성하고, 이를 쿠버네티스 클러스터에 적용한다.
이 과정에서 헬름은 배포된 애플리케이션의 릴리즈를 추적한다. 각 설치 인스턴스는 고유한 릴리즈 이름으로 식별되며, helm upgrade 명령을 통해 새로운 설정이나 차트 버전으로 애플리케이션을 업그레이드하거나, helm rollback 명령으로 이전 상태로 복구할 수 있다. 이를 통해 애플리케이션의 수명 주기 관리를 체계적으로 수행할 수 있다.
또한 헬름은 헬름 차트 리포지토리를 통해 차트의 저장, 공유, 검색을 지원한다. Artifact Hub와 같은 공개 허브나 사설 리포지토리에 차트를 배포하면, 다른 사용자들이 helm repo add 명령으로 리포지토리를 등록하고 해당 차트를 쉽게 찾아 설치할 수 있다. 이는 DevOps와 CI/CD 파이프라인에서 애플리케이션 배포의 재현성과 자동화를 크게 향상시킨다.
4. 주요 명령어 및 사용법
4. 주요 명령어 및 사용법
4.1. 차트 생성 및 검사
4.1. 차트 생성 및 검사
헬름 차트를 생성하는 기본 명령어는 helm create이다. 이 명령을 실행하면 지정한 이름의 디렉토리가 생성되며, 해당 디렉토리 안에 Chart.yaml, values.yaml, templates/ 디렉토리 등 차트의 기본 구조와 파일들이 자동으로 만들어 진다. 이렇게 생성된 기본 차트는 NGINX 웹 서버를 배포하는 예제로 구성되어 있어, 사용자가 이를 수정하여 자신의 애플리케이션에 맞는 차트로 개발할 수 있는 출발점을 제공한다.
생성된 차트의 구조와 문법이 올바른지 검사하기 위해 helm lint 명령어를 사용한다. 이 명령은 Chart.yaml 파일의 필수 필드 누락, 템플릿 파일의 구문 오류, 의존성 선언 문제 등 다양한 잠재적 문제점을 점검한다. 린트 검사는 차트를 리포지토리에 공개하거나 다른 환경에 배포하기 전에 반드시 수행해야 하는 단계로, 표준을 준수하고 오류를 사전에 방지하는 데 도움이 된다.
차트의 템플릿이 실제 쿠버네티스 매니페스트로 어떻게 렌더링되는지 미리 확인하려면 helm template 명령을 사용한다. 이 명령은 values.yaml 파일이나 커맨드라인에서 전달한 값을 기반으로 템플릿을 처리하여 생성될 최종 YAML 출력을 보여준다. 이를 통해 사용자는 배포 전에 생성될 리소스를 검증하고, 템플릿 엔진의 로직과 값 주입이 의도대로 작동하는지 확인할 수 있다.
또한 helm install 명령에 --dry-run과 --debug 옵션을 함께 사용하면, 차트를 실제 클러스터에 설치하지 않고도 렌더링된 매니페스트와 설치 정보를 시뮬레이션하여 볼 수 있다. 이는 차트의 설치 동작을 완벽하게 테스트하는 데 유용한 방법이다. 이러한 생성 및 검사 도구들은 DevOps 실무에서 안정적이고 재현 가능한 애플리케이션 배포를 보장하는 핵심 과정을 구성한다.
4.2. 차트 패키징 및 배포
4.2. 차트 패키징 및 배포
헬름 차트를 개발한 후에는 패키징하여 배포할 수 있다. 패키징은 helm package 명령어로 수행하며, 이 과정에서 차트 디렉토리가 .tgz 확장자를 가진 압축 파일로 변환된다. 패키징 시 Chart.yaml 파일에 정의된 버전 정보가 패키지 이름에 포함되며, 필요에 따라 --version 플래그로 버전을 덮어쓸 수 있다. 생성된 패키지 파일은 헬름 차트 리포지토리에 업로드하여 공유하거나, helm install 명령어에 직접 경로를 지정하여 로컬에서 설치할 수 있다.
배포를 위해서는 패키지를 아티팩트 허브와 같은 공개 리포지토리나 사설 HTTP 서버, 객체 저장소에 호스팅해야 한다. 리포지토리 호스팅은 helm repo index 명령어로 패키지 파일들의 인덱스(index.yaml)를 생성한 후, 해당 파일과 패키지 파일들을 정적 웹 서버에 배치하는 방식으로 이루어진다. 이후 사용자는 helm repo add 명령어로 해당 리포지토리를 추가하여 차트를 검색하고 설치할 수 있다.
패키징과 배포 과정은 CI/CD 파이프라인에 통합하여 자동화하는 것이 일반적이다. 이를 통해 애플리케이션 코드 변경에 따른 새로운 차트 버전의 생성, 패키징, 리포지토리 업로드가 자동으로 수행되어 배포 효율성을 높일 수 있다. 또한 헬름 차트 리포지토리는 OCI 레지스트리를 지원하여 컨테이너 이미지와 유사한 방식으로 차트를 저장하고 배포할 수도 있다.
4.3. 리포지토리 관리
4.3. 리포지토리 관리
헬름 차트 리포지토리는 패키지화된 헬름 차트를 저장하고 공유하는 서버이다. 이는 APT나 YUM과 같은 전통적인 패키지 관리자의 저장소와 유사한 역할을 하며, 사용자가 helm install 명령어를 통해 원격 차트를 쉽게 찾아 설치할 수 있게 해준다. 리포지토리는 간단한 HTTP 서버로 구축할 수 있으며, S3 버킷이나 GitHub Pages와 같은 정적 호스팅 서비스를 활용하는 것이 일반적이다. 리포지토리의 핵심은 index.yaml 파일로, 이 파일은 저장된 모든 차트의 메타데이터와 다운로드 URL 목록을 담고 있다.
리포지토리를 관리하는 주요 작업은 차트를 추가하고 인덱스 파일을 생성 또는 갱신하는 것이다. helm repo index 명령어는 주어진 디렉토리에 있는 차트(.tgz 파일)들을 스캔하여 index.yaml 파일을 생성한다. 새로운 차트 버전을 리포지토리에 배포할 때마다 이 인덱스를 재생성하여 최신 정보를 반영해야 한다. 사용자는 helm repo add 명령으로 이 리포지토리를 로컬에 등록한 후, helm repo update를 실행하여 로컬 캐시를 최신 인덱스로 갱신할 수 있다.
공개 차트를 탐색하고 배포하는 데는 CNCF가 후원하는 Artifact Hub가 사실상의 표준 플랫폼으로 자리 잡았다. 개발자들은 Artifact Hub에 자신의 차트 리포지토리를 등록하여 전 세계 사용자에게 노출시킬 수 있다. 한편, 조직 내부에서만 사용하는 프라이빗 차트를 관리해야 할 경우, 차트 뮤지엄 프로젝트나 OCI 호환 레지스트리를 리포지토리 백엔드로 사용할 수 있으며, 젠킨스나 깃랩과 같은 CI/CD 파이프라인에 차트 패키징 및 리포지토리 업데이트 작업을 통합하는 것이 일반적인 관행이다.
4.4. 차트 설치/업그레이드/삭제
4.4. 차트 설치/업그레이드/삭제
헬름 차트의 설치, 업그레이드, 삭제는 helm install, helm upgrade, helm uninstall 명령어를 통해 이루어진다. 이 명령어들은 쿠버네티스 클러스터에 애플리케이션을 배포하고 관리하는 핵심 작업을 수행한다.
helm install 명령어는 차트를 쿠버네티스 클러스터에 배포한다. 사용자는 로컬에 있는 차트 디렉토리, 패키지된 .tgz 파일, 또는 헬름 리포지토리에서 가져온 차트 이름을 지정할 수 있다. 설치 시 --values 또는 --set 옵션을 사용해 values.yaml 파일의 기본값을 재정의할 수 있으며, --name 옵션으로 배포에 고유한 릴리스 이름을 부여한다. 이 릴리스 이름은 이후 해당 배포를 관리하는 데 사용되는 핵심 식별자이다.
배포된 애플리케이션을 업데이트할 때는 helm upgrade 명령어를 사용한다. 이 명령어는 기존 릴리스 이름과 업그레이드할 차트의 새 버전 또는 수정된 구성을 지정한다. 헬름은 롤링 업데이트 전략을 지원하여 애플리케이션의 다운타임 없이 신규 버전으로 점진적으로 전환할 수 있도록 한다. 업그레이드 중 문제가 발생하면 helm rollback 명령어를 사용해 이전 정상 버전으로 빠르게 복구할 수 있다.
애플리케이션을 클러스터에서 제거하려면 helm uninstall 명령어를 사용한다. 이 명령어는 지정된 릴리스 이름에 해당하는 모든 쿠버네티스 리소스를 삭제한다. 삭제 후에도 helm list --all 명령어로 릴리스 기록을 확인할 수 있으며, 필요시 helm install을 다시 실행해 동일한 릴리스 이름으로 재배포하는 것도 가능하다. 이러한 설치, 업그레이드, 삭제 사이클은 DevOps와 CI/CD 파이프라인에서 애플리케이션 라이프사이클을 자동화하는 데 필수적이다.
5. 템플릿 엔진과 기능
5. 템플릿 엔진과 기능
5.1. Go 템플릿 문법
5.1. Go 템플릿 문법
헬름 차트의 템플릿은 Go 프로그래밍 언어의 텍스트/템플릿 패키지를 기반으로 한 Go 템플릿 문법을 사용하여 작성된다. 이 문법은 템플릿 파일 내에서 동적인 값을 처리하고, 조건문과 반복문을 적용하며, 다양한 함수를 호출할 수 있게 해준다. 기본적인 표현식은 이중 중괄호 {{ }}로 감싸서 표시하며, 이를 통해 템플릿 엔진이 해당 부분을 렌더링 시 평가하고 결과값으로 대체한다.
템플릿 문법의 핵심 요소로는 값 출력, 파이프라인, 흐름 제어가 있다. 단순한 값 출력은 {{ .Values.image.repository }}와 같이 점(.)으로 시작하는 경로를 사용하여 values.yaml 파일이나 다른 내장 객체의 값을 참조한다. 파이프라인(|)은 함수를 연쇄적으로 적용하는 데 사용되며, 예를 들어 {{ .Values.name | upper | quote }}는 이름 값을 대문자로 변환한 후 따옴표로 감싼다. 흐름 제어는 {{ if ... }} ... {{ end }}, {{ range ... }} ... {{ end }}, {{ with ... }} ... {{ end }}와 같은 구문을 제공하여 조건부 렌더링과 반복 처리를 가능하게 한다.
헬름은 표준 Go 템플릿 기능 외에도 템플릿 작성 편의를 위해 수십 개의 스프리그 라이브러리 함수를 추가로 제공한다. 이 함수들은 문자열 조작, 목록 및 딕셔너리 작업, 암호학적 함수, 날짜 형식 지정 등 다양한 유틸리티 기능을 포함한다. 또한 {{ include }} 함수를 사용하여 다른 템플릿 파일의 내용을 재사용하거나, {{ tpl }} 함수를 통해 문자열 내의 템플릿 구문을 재귀적으로 평가할 수 있다.
이 템플릿 문법을 통해 개발자는 단일 차트로 다양한 환경(개발, 스테이징, 프로덕션)에 맞는 쿠버네티스 매니페스트를 생성할 수 있다. 템플릿은 최종적으로 헬름에 의해 렌더링되어 순수한 YAML 형식의 쿠버네티스 리소스 정의 파일로 변환된 후 쿠버네티스 API 서버에 전달되어 적용된다.
5.2. 내장 객체 및 함수
5.2. 내장 객체 및 함수
헬름 템플릿은 Go 템플릿 문법을 기반으로 하며, 템플릿 파일을 렌더링할 때 사용할 수 있는 다양한 내장 객체와 함수를 제공한다. 이 객체와 함수들은 템플릿 내에서 .Values, .Chart, .Release 같은 변수로 접근하여 동적인 쿠버네티스 매니페스트를 생성하는 데 핵심적인 역할을 한다.
가장 중요한 내장 객체로는 애플리케이션 설정값을 담고 있는 .Values 객체, Chart.yaml 파일의 메타데이터를 담은 .Chart 객체, 현재 릴리스 정보를 포함하는 .Release 객체, 그리고 템플릿 파일 자체에 대한 정보를 가진 .Template 객체 등이 있다. 예를 들어, {{ .Values.image.tag }}는 사용자가 정의한 Docker 이미지 태그 값을 참조한다. 또한 .Files 객체를 통해 차트 내에 포함된 정적 파일에 접근하거나, .Capabilities 객체를 통해 대상 쿠버네티스 클러스터의 API 버전 정보를 확인할 수 있다.
헬름은 표준 Go 템플릿 함수 외에도 템플릿 작성을 돕는 60개 이상의 고유 함수를 제공한다. 이 함수들은 주로 sprig 라이브러리에서 가져온 것으로, 문자열 조작, 숫자 연산, 리스트 처리, 암호화 작업 등을 수행한다. 예를 들어 {{ quote .Values.appName }}으로 문자열을 따옴표로 감싸거나, {{ .Values.replicas | default 3 }}처럼 파이프라인을 사용해 기본값을 설정할 수 있다. 특히 쿠버네티스 리소스 생성을 위한 include 함수와 toYaml 함수는 복잡한 템플릿을 모듈화하고 YAML 형식으로 출력하는 데 필수적이다.
이러한 내장 객체와 함수들을 조합하여, 개발자는 단일 차트로 다양한 환경(개발, 스테이징, 프로덕션)에 맞춘 설정을 생성할 수 있다. 이는 DevOps와 CI/CD 파이프라인에서 애플리케이션 배포를 표준화하고 자동화하는 데 큰 장점을 제공한다.
5.3. 파이프라인과 흐름 제어
5.3. 파이프라인과 흐름 제어
헬름 차트의 템플릿은 Go 템플릿 문법을 기반으로 하며, 파이프라인과 흐름 제어 기능을 통해 동적이고 복잡한 쿠버네티스 매니페스트 생성을 가능하게 한다. 파이프라인은 데이터를 일련의 함수에 연속적으로 적용하는 방식으로, {{ .Values.image.tag | default "latest" | quote }}와 같은 형태로 사용된다. 이 예시에서 .Values.image.tag 값은 먼저 default 함수를 거쳐 기본값 "latest"가 설정되고, 최종적으로 quote 함수를 통해 따옴표로 감싸진다. 이를 통해 값의 존재 여부를 확인하고 형식을 표준화하는 등 다단계 처리를 간결하게 표현할 수 있다.
흐름 제어는 if/else, with, range와 같은 구문을 통해 템플릿의 논리적 분기와 반복을 담당한다. if 문은 특정 조건에 따라 템플릿의 일부를 포함하거나 제외시킬 때 사용되며, 예를 들어 {{ if .Values.ingress.enabled }} 구문은 인그레스를 활성화할 때만 관련 매니페스트를 생성한다. with 문은 현재 스코프를 변경하여 특정 객체 내부의 필드에 반복적으로 접근할 때 코드를 단순화하는 데 유용하다. range 문은 리스트나 맵과 같은 컬렉션을 순회하며, 이를 통해 다수의 컨테이너나 환경 변수를 반복적으로 정의할 수 있다.
이러한 기능들은 YAML 파일의 정적 한계를 극복하고, 하나의 차트로 다양한 환경(예: 개발, 스테이징, 프로덕션)에 맞춘 설정을 생성하는 데 핵심적이다. 개발자는 values.yaml 파일에 정의된 변수들과 템플릿의 논리 구조를 조합하여 선언적이면서도 강력한 배포 패키지를 만들 수 있다. 결과적으로 파이프라인과 흐름 제어는 헬름을 단순한 패키징 도구를 넘어서는 선언적 프로그래밍 도구로 만드는 기반이 된다.
6. 차트 개발 모범 사례
6. 차트 개발 모범 사례
6.1. 의존성 관리
6.1. 의존성 관리
헬름 차트는 다른 헬름 차트에 대한 의존성을 정의하고 관리할 수 있다. 이를 통해 복잡한 애플리케이션을 모듈화하고 재사용 가능한 컴포넌트로 구성할 수 있다. 의존성은 Chart.yaml 파일의 dependencies 필드에 명시된다. 각 의존성 항목은 차트 이름, 버전, 리포지토리 위치를 포함하며, 조건부 설치나 값 오버라이드와 같은 추가 설정도 가능하다.
의존성 관리는 helm dependency 명령어를 통해 이루어진다. helm dependency update를 실행하면 Chart.yaml에 정의된 의존성 정보를 바탕으로 charts/ 디렉토리에 필요한 서브 차트를 다운로드한다. 이때 의존성 차트의 아카이브 파일(.tgz)이 생성되거나, 리포지토리에서 직접 패키지를 가져온다. helm dependency list 명령으로 현재 차트의 의존성 상태를 확인할 수 있다.
의존성 차트는 부모 차트의 일부로 함께 설치되며, 부모 차트의 values.yaml 파일을 통해 서브 차트의 설정값을 중앙에서 관리할 수 있다. 이는 마이크로서비스 아키텍처에서 공통 인프라 컴포넀이언트(예: Redis, MySQL, Nginx 인그레스 컨트롤러)를 별도 차트로 분리하고 필요할 때 참조하는 방식에 유용하다. 또한, CI/CD 파이프라인에서 애플리케이션과 그 의존성을 하나의 패키지로 통합하여 배포하는 데 적합하다.
의존성을 효과적으로 관리하기 위해서는 명확한 버전 범위를 지정하고, 안정적인 차트 리포지토리를 사용하며, 주기적으로 의존성 차트를 업데이트하여 보안 패치와 기능 개선을 반영해야 한다. Artifact Hub와 같은 중앙 리포지토리에서 공개된 차트를 검증하여 사용하는 것이 좋은 관행이다.
6.2. 보안 고려사항
6.2. 보안 고려사항
헬름 차트를 개발하거나 사용할 때는 여러 보안 측면을 고려해야 한다. 차트의 템플릿이 생성하는 쿠버네티스 매니페스트에 민감한 정보가 노출되거나, 취약한 설정이 포함되지 않도록 주의해야 한다. 특히 values.yaml 파일을 통해 사용자 입력을 받을 때, 이 입력값이 적절히 검증되지 않고 직접 템플릿에 사용되면 보안 위협이 될 수 있다. 예를 들어, 사용자 입력이 컨테이너의 환경 변수나 커맨드 라인 인수로 직접 전달될 경우, 명령어 주입 공격에 취약해질 수 있다.
차트의 의존성을 관리할 때도 보안을 고려한다. 외부 차트 리포지토리에서 가져온 차트나 컨테이너 이미지가 신뢰할 수 있는 출처인지 확인해야 한다. Artifact Hub와 같은 공식 리포지토리를 활용하거나, 내부적으로 검증된 리포지토리를 구축하는 것이 좋다. 또한, 차트에 사용되는 모든 컨테이너 이미지는 가능한 최신 버전을 사용하고, 알려진 취약점이 없는지 정기적으로 스캔해야 한다.
템플릿 작성 시에는 RBAC 권한을 최소한으로 구성하고, 불필요한 권한을 서비스 어카운트나 파드에 부여하지 않도록 해야 한다. 또한, 시크릿 정보를 평문으로 values.yaml에 저장하지 않고, 쿠버네티스의 시크릿 오브젝트를 참조하거나, 외부 시크릿 관리 시스템을 연동하는 방식을 사용한다. 차트를 패키징하여 배포하기 전에 helm template 명령어로 렌더링된 매니페스트를 검토하고, 정적 분석 도구를 활용해 보안 취약점을 점검하는 것이 모범 사례이다.
6.3. 유연한 values 설계
6.3. 유연한 values 설계
차트의 유연성을 확보하려면 values.yaml 파일의 설계가 매우 중요하다. 이 파일은 사용자가 차트를 설치하거나 업그레이드할 때 기본 설정을 재정의할 수 있는 인터페이스를 제공한다. 잘 설계된 values.yaml은 다양한 환경(예: 개발, 스테이징, 프로덕션)과 사용 사례에 맞게 차트를 쉽게 적용할 수 있게 해준다.
설계 시 핵심은 적절한 기본값을 제공하면서도 필요한 모든 구성을 외부에서 주입 가능하도록 하는 것이다. 이를 위해 values.yaml에는 애플리케이션의 핵심 설정, 예를 들어 레플리카 수, 이미지 태그, 리소스 요청 및 제한, 환경 변수, 서비스 타입 및 포트, Ingress 호스트 설정 등이 포함된다. 각 값은 명확한 주석으로 설명되어야 하며, 가능하면 실제 동작하는 합리적인 기본값으로 설정되어 바로 사용할 수 있어야 한다.
또한, 구조화된 값을 적극 활용하는 것이 좋다. 예를 들어, 복잡한 컨피그맵 데이터나 여러 컨테이너에 대한 설정을 단일 값으로 나열하기보다는 계층적인 YAML 구조로 정의하면 가독성과 관리 편의성이 높아진다. 이렇게 설계하면 사용자는 필요한 부분만 덮어쓰기(Override)할 수 있어 전체 파일을 복사하지 않고도 정밀한 제어가 가능하다.
마지막으로, 보안과 관련된 민감한 정보(예: 비밀번호, API 키)는 절대 values.yaml에 기본값으로 하드코딩해서는 안 된다. 대신 헬름의 --set 옵션이나 외부 비밀 관리 도구를 통해 주입하도록 안내해야 한다. 또한, README.md 파일에 주요 설정값과 그 의미, 사용 예시를 상세히 문서화하여 차트 사용자가 쉽게 이해하고 활용할 수 있도록 해야 한다.
7. Artifact Hub 및 차트 리포지토리
7. Artifact Hub 및 차트 리포지토리
헬름 차트 리포지토리는 패키지된 차트 파일(.tgz)을 저장하고 제공하는 서버 또는 저장소이다. 이는 APT나 YUM과 같은 전통적인 패키지 관리자의 저장소와 유사한 개념으로, 사용자는 리포지토리 URL을 등록하여 공개된 차트를 검색하고 설치할 수 있다. 리포지토리는 HTTP 또는 HTTPS를 통해 접근 가능한 정적 파일 서버로 구성할 수 있으며, Amazon S3, Google Cloud Storage, GitHub Pages 등이 일반적으로 사용된다.
Artifact Hub는 CNCF 산하의 오픈소스 메타데이터 검색 포털로, 헬름 차트를 포함한 다양한 쿠버네티스 패키지의 중앙 집중식 검색 및 발견을 제공한다. 이는 공개된 헬름 리포지토리를 크롤링하여 차트의 메타데이터를 수집하고, 사용자 인터페이스를 통해 카테고리, 키워드, 인기 순으로 검색할 수 있게 한다. 아티팩트 허브는 단일 리포지토리가 아니며, 차트 자체를 호스팅하지는 않지만 전 세계의 다양한 리포지토리로 연결되는 허브 역할을 한다.
차트 리포지토리를 운영할 때는 index.yaml 파일이 핵심이다. 이 파일은 리포지토리에 존재하는 모든 차트의 메타데이터(이름, 버전, 설명, URL) 목록을 담고 있으며, helm repo index 명령어로 생성된다. 사용자가 helm repo add로 리포지토리를 추가하면 헬름 클라이언트는 이 index.yaml을 가져와 로컬 캐시에 저장하여 차트 검색 및 설치를 가능하게 한다.
아티팩트 허브와 같은 중앙 검색 포털의 등장으로 차트의 발견성이 크게 향상되었으며, 이는 헬름 생태계의 활성화에 기여했다. 조직은 내부적으로 사설 리포지토리를 구축하여 자체 개발한 차트나 수정된 공개 차트를 팀 내에서 안전하게 공유하고 관리할 수 있다.
8. 관련 도구 및 확장
8. 관련 도구 및 확장
8.1. Helmfile
8.1. Helmfile
헬름파일은 헬름 차트의 배포를 선언적으로 관리하기 위한 도구이다. 복잡한 다중 차트 환경에서 여러 헬름 릴리즈를 하나의 구성 파일로 정의하고, 일관되게 설치하거나 업그레이드하는 작업을 단순화한다. 하나의 helmfile.yaml 파일 안에 여러 헬름 차트 릴리즈, 각 릴리즈에 사용할 values.yaml 파일, 그리고 대상 쿠버네티스 클러스터나 네임스페이스를 명시할 수 있어, CI/CD 파이프라인에서의 배포 자동화에 유용하게 활용된다.
헬름파일의 핵심 기능은 의존성 있는 릴리즈들을 올바른 순서로 배포하고, 다양한 환경(예: 개발, 스테이징, 프로덕션)별로 다른 값을 주입할 수 있게 하는 것이다. 사용자는 helmfile sync, helmfile apply, helmfile destroy와 같은 명령어를 통해 선언된 전체 애플리케이션 스택을 한 번에 관리할 수 있다. 이는 개별 helm install/upgrade 명령어를 반복 실행하는 수고를 덜어주며, GitOps 방식의 인프라 관리 패턴을 구현하는 데 적합한 도구가 된다.
헬름파일은 헬름 차트 리포지토리 외에도 로컬 차트 경로, Git 저장소, 심지어 Kustomize 오버레이와 같은 다른 배포 정의를 통합하는 것을 지원한다. 또한 시크릿 관리 도구와의 연동을 통해 민감한 값을 안전하게 처리할 수 있는 기능을 제공하기도 한다. 따라서 대규모 마이크로서비스 아키텍처나 여러 팀이 협업하는 DevOps 환경에서 헬름의 사용성을 크게 향상시키는 확장 도구로 평가받는다.
8.2. Kustomize와의 비교
8.2. Kustomize와의 비교
헬름 차트와 Kustomize는 모두 쿠버네티스 애플리케이션의 배포와 관리를 단순화하는 도구이지만, 접근 방식과 철학에서 근본적인 차이를 보인다. 헬름은 패키지 관리자로서 애플리케이션을 차트라는 독립된 패키지로 묶어 버전을 관리하고 배포하는 데 중점을 둔다. 반면, Kustomize는 네이티브 쿠버네티스 매니페스트 파일을 그대로 유지한 상태에서, 선언적인 방식으로 환경별(예: 개발, 스테이징, 프로덕션) 차이점만을 오버레이하여 관리하는 패치 기반의 도구이다.
두 도구의 핵심 차이는 템플릿 사용 여부에 있다. 헬름은 Go 템플릿 엔진을 사용하여 동적인 값을 주입할 수 있는 강력한 템플릿을 제공한다. 이는 복잡한 애플리케이션을 하나의 패키지로 정의하고, values.yaml 파일을 통해 다양한 구성으로 재사용하는 데 유리하다. Kustomize는 템플릿을 사용하지 않으며, 순수 YAML 파일을 기반으로 kustomization.yaml 파일에서 리소스, 패치, 이미지 변경사항 등을 선언하여 원본 매니페스트를 변형한다. 이는 쿠버네티스 네이티브 방식에 더 가까워 학습 곡선이 낮고, 기존 매니페스트 파일을 크게 변경하지 않고도 관리할 수 있다는 장점이 있다.
비교 항목 | 헬름 (Helm) | Kustomize |
|---|---|---|
핵심 개념 | 패키지 관리 및 템플릿 | 선언적 오버레이 및 패치 |
구성 방식 | 템플릿 기반 동적 생성 | 기반 YAML 파일의 변형 |
배포 단위 | 차트 (Chart) 패키지 | 디렉토리 (기반 + 오버레이) |
버전 관리 | 차트 버전 및 애플리케이션 버전 관리 | Git 등 외부 버전 관리 시스템에 의존 |
복잡한 구성 | 템플릿 로직으로 유연한 구성 가능 | 단순한 병합과 패치에 적합 |
사용 사례에 따라 선택이 달라진다. 헬름은 공개된 서드파티 애플리케이션(예: nginx 인그레스 컨트롤러, 프로메테우스 모니터링 스택)을 공식 리포지토리에서 쉽게 찾아 설치하고, 내부적으로도 재사용 가능한 차트 라이브러리를 구축할 때 강점을 발휘한다. Kustomize는 조직 내에서 GitOps 워크플로우를 구현하거나, 여러 환경에 배포되는 동일한 애플리케이션의 구성 드리프트를 최소화하는 데 적합하다. 현실적으로 많은 팀은 헬름 차트의 패키징 이점과 Kustomize의 세밀한 패치 기능을 함께 활용하는 하이브리드 방식을 채택하기도 한다.
9. 여담
9. 여담
헬름은 쿠버네티스 생태계에서 '패키지 관리자'라는 핵심 역할을 수행하며, 그 이름은 선박의 조타 장치인 '헬름'에서 유래했다. 이는 복잡한 쿠버네티스 애플리케이션을 안정적으로 조종하고 관리한다는 의미를 담고 있다. 초기에는 Deis라는 회사에서 개발했으나, 이후 프로젝트의 중요성을 인정받아 CNCF에 기증되어 현재는 공식 쿠버네티스 생태계 프로젝트로 자리 잡았다.
헬름 차트는 애플리케이션 배포를 표준화하는 강력한 도구이지만, 초보자에게는 Go 템플릿 문법과 values.yaml 파일의 복잡한 계층 구조가 진입 장벽으로 작용할 수 있다. 특히 템플릿 내에서 조건문과 반복문을 사용할 때 문법 오류가 발생하기 쉬워, helm template --debug 명령어를 통해 렌더링 결과를 미리 검증하는 것이 좋은 습관이다.
헬름의 성공 이후, 보다 선언적이고 간결한 구성 관리 도구에 대한 수요도 증가했다. 이에 따라 Kustomize와 같은 네이티브 쿠버네티스 도구나 Helmfile을 이용한 멀티 차트 배포 전략 등 다양한 대안과 보완 도구가 등장하며 생태계가 풍부해졌다. 헬름은 이러한 도구들과 경쟁 또는 협력 관계를 형성하며 지속적으로 발전하고 있다.
많은 조직에서 헬름 차트를 내부 CI/CD 파이프라인에 통합하여, 애플리케이션 코드 변경과 함께 인프라 구성의 버전 관리 및 자동 배포를 실현하고 있다. 이는 DevOps 문화와 GitOps 운영 모델을 구현하는 데 핵심적인 기술 요소로 자리매김하고 있다.
